/**
 * @brief  配置ESP8266的NTP功能
 * @retval 配置成功返回true，失败返回false
 */
bool ESP8266_NTP_Config(void)
{
    char cCmd[100];

    // 设置时区为东八区(北京时间)
    sprintf(cCmd, "AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\",\"ntp2.aliyun.com\",\"ntp3.aliyun.com\"");

    return ESP8266_Send_AT_Cmd(cCmd, "OK", NULL, 2000);
}

/**
 * @brief  获取NTP时间
 * @param  timeBuffer: 存储时间的缓冲区
 * @param  bufferSize: 缓冲区大小
 * @retval 获取成功返回true，失败返回false
 */
bool ESP8266_Get_NTP_Time(char *timeBuffer, uint32_t bufferSize)
{
    if (ESP8266_Send_AT_Cmd("AT+CIPSNTPTIME?", "+CIPSNTPTIME:", NULL, 3000))
    {
        // 从接收缓冲区中提取时间信息
        char *timeStart = strstr(ESP8266_Fram_Record_Struct.Data_RX_BUF, "+CIPSNTPTIME:");
        if (timeStart != NULL)
        {
            timeStart += strlen("+CIPSNTPTIME:");
            char *timeEnd = strstr(timeStart, "\r\n");
            if (timeEnd != NULL)
            {
                uint32_t timeLength = timeEnd - timeStart;
                if (timeLength < bufferSize - 1)
                {
                    strncpy(timeBuffer, timeStart, timeLength);
                    timeBuffer[timeLength] = '\0';
                    return true;
                }
            }
        }
    }
    return false;
}

/**
 * @brief  NTP时间同步测试函数
 */
void ESP8266_NTP_Time_Test(void)
{
    char timeBuffer[100];
    char str[200];

    printf("***************恢复出厂默认模式***************\r\n");
    ESP8266_AT_Test(); // 恢复出厂默认模式

    printf("***************正在配置STA模式***************\r\n");
    ESP8266_Net_Mode_Choose(STA);

    printf("***************连接WiFi***************\r\n");
    while (!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD))
    {
        printf("WiFi连接失败，重试中...\r\n");
        HAL_Delay(2000);
    }
    printf("WiFi连接成功!\r\n");

    printf("***************配置NTP***************\r\n");
    if (ESP8266_NTP_Config())
    {
        printf("NTP配置成功!\r\n");
    }
    else
    {
        printf("NTP配置失败!\r\n");
        return;
    }

    printf("***************开始同步时间***************\r\n");
    while (1)
    {
        if (ESP8266_Get_NTP_Time(timeBuffer, sizeof(timeBuffer)))
        {
            // 格式化输出时间信息
            sprintf(str, "当前网络时间: %s\r\n", timeBuffer);
            printf("%s", str);

            // 也可以通过串口1发送到调试工具
            USART_printf(&huart1, "网络时间同步成功: %s\r\n", timeBuffer);
        }
        else
        {
            printf("获取时间失败，重试中...\r\n");
            USART_printf(&huart1, "获取网络时间失败\r\n");
        }

        HAL_Delay(5000); // 每5秒同步一次
    }
}